package com.yuma.tingshu.album.config;

import com.yuma.tingshu.common.constant.RabbitConstant;
import org.springframework.amqp.core.*;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * 专辑rabbitmq配置类
 * 被 @Configuration 注解的类会被 Spring 容器识别为配置类，用于定义 Bean 对象和配置信息
 * 在注解驱动开发中，@Configuration 注解的类可以完全替代 XML 配置文件，通过代码的方式配置 Spring 容器
 * 在配置类中，可以使用 @Bean 注解方法来定义 Bean 对象，这些方法的返回值会被 Spring 容器管理
 */
//@Configuration
public class RabbitAlbumConfig {

    //定义一个交换机
    @Bean(RabbitConstant.ALBUM_EXCHANGE)
    public TopicExchange albumExchange(){
        return ExchangeBuilder
                .topicExchange(RabbitConstant.ALBUM_EXCHANGE)
                .durable(true)//设置为持久化
                .ignoreDeclarationExceptions()//表示忽略声明时的异常
                .build();
    }

    //定义一save个队列
    @Bean(RabbitConstant.ALBUM_SAVE_QUEUE)
    public Queue albumSaveQueue(){
        return QueueBuilder
                .durable(RabbitConstant.ALBUM_SAVE_QUEUE)//持久化队列意味着队列中的消息在 RabbitMQ 重启后不会丢失
                .build();
    }

    //定义一个delete队列
    @Bean(RabbitConstant.ALBUM_DELETE_QUEUE)
    public Queue albumDeleteQueue(){
        return QueueBuilder
                .durable(RabbitConstant.ALBUM_DELETE_QUEUE)
                .build();
    }

    //绑定save队列和交换机
    @Bean
    public Binding bindAlbumSaveQueue(TopicExchange albumExchange, @Qualifier(RabbitConstant.ALBUM_SAVE_QUEUE) Queue albumSaveQueue){
        return BindingBuilder.bind(albumSaveQueue).to(albumExchange).with(RabbitConstant.ALBUM_SAVE_RK);
    }

    //绑定delete队列和交换机
    @Bean
    public Binding bindAlbumDeleteQueue(TopicExchange albumExchange, @Qualifier(RabbitConstant.ALBUM_DELETE_QUEUE) Queue albumDeleteQueue){
        return BindingBuilder.bind(albumDeleteQueue).to(albumExchange).with(RabbitConstant.ALBUM_DELETE_RK);
    }
}
